// stack 栈

/**
 * Stack 栈
 * 栈对象是一种遵循先进后出原则的数据结构类型
 * 只能访问与操作栈顶元素
 */
class Stack<T=any>{
    // 声明存储对象
    items:T[];
    // 声明size对象
    stackSize:number=0;

    // 初始化对象
    constructor(...arg:T[]){
        this.items = [...arg];
        this.stackSize = arg.length;
    }

    // push 为栈中添加一个或者多个元素
    push(...args:T[]):void{
        if(!args.length){
            return
        }
        this.items = [...this.items, ...args];
        this.stackSize += args.length;
    }

    //pop 删除栈顶元素,同时返回被删除的元素
    pop():T | undefined{
        if(this.stackSize <= 0){
            return undefined;
        }
        const popItem:T = this.items[this.stackSize-1];
        this.items = this.items.slice(0,this.stackSize-1);
        this.stackSize-=1;
        return popItem;
    }

    //peek 返回栈顶元素  但是不进行任何操作
    peek():T | undefined{
        return this.stackSize>0 ? this.items[this.stackSize-1] : undefined;
    }

    // isEmpty 判断当前栈结构是否为空
    isEmpty():Boolean{
        return this.stackSize <= 0;
    }

    // clear  清空当前栈
    clear():void{
        this.items.length = 0;
        this.stackSize = 0;
    }

    // size  放回当前栈元素的个数
    size():number{
        return this.stackSize;
    }

}

export default Stack;